/**
 * 
 */
package com.myworld.rpc.serverStub;

import java.lang.reflect.Method;
import java.util.Set;
import org.reflections.Reflections;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;



/**
 * 服务器端业务处理类
 */
public class InvokeHandler extends ChannelInboundHandlerAdapter{

	/**
	 * 得到某个接口下某个实现类的名字
	 * @param classInfo 接口信息
	 * @return
	 * @throws Exception
	 */
	private String getImplClassName(ClassInfo classInfo) throws Exception{
		//获得服务方接口所在路径
		String interfacePath="com.myworld.rpc.server";
		int lastDot=classInfo.getClassName().lastIndexOf(".");
		String interfaceName=classInfo.getClassName().substring(lastDot);
		Class superClass=Class.forName(interfacePath+interfaceName);
		Reflections reflections=new Reflections(interfacePath);
		//得到某接口下的所有实现类
		Set<Class> impleClassSet=reflections.getSubTypesOf(superClass);
		if(impleClassSet.size()==0){
			System.out.println("未找到实现类");
			return null;
		}else if(impleClassSet.size()>1){
			System.out.println("找到多个实现类，未明确使用哪一个");
			return null;
		}else{
			//把集合转换为数组
			Class[] classes=impleClassSet.toArray(new Class[0]);
			return classes[0].getName(); //得到实现类的名字
		}
	}
	
	@Override
	public void channelRead(ChannelHandlerContext ctx,Object msg) throws Exception{
		ClassInfo classInfo=(ClassInfo)msg;
		Object clazz=Class.forName(getImplClassName(classInfo)).newInstance();
		Method method=clazz.getClass().getMethod(classInfo.getMethodName(), classInfo.getTypes());
		//通过反射调用实现类方法
		Object result=method.invoke(clazz, classInfo.getObjects());
		ctx.writeAndFlush(result);
	}

}
